package com.tcs.service;

import java.util.List;
import com.tcs.model.Requisition;
import com.tcs.model.RequisitionClose;
import com.tcs.model.RequisitionDetail;
import com.tcs.model.RequisitionState;

public interface RequisitionService {

	/**
	 * Funcion que permite agregar un detalle de pedido
	 * 
	 * @param requisitionDetail
	 */
	public void addRequisitionDetail(RequisitionDetail requisitionDetail);

	/**
	 * Funcion que elimina un Detalle de pedido
	 * 
	 * @param requisitionDetail
	 */
	public void deleteRequisitionDetail(RequisitionDetail requisitionDetail);

	/**
	 * Funcion para eliminar todos los detalles de pedidos que tengan la id de
	 * articulo asociado
	 * 
	 * @param id
	 */

	public void deleteRequisitionDetail(int id);

	/**
	 * Funcion que permite agregar un pedido
	 * 
	 * @param requisition
	 */
	public void addRequisition(Requisition requisition);

	/**
	 * Funcion que permite agregar un pedido Cerrado
	 * 
	 * @param requisitionClose
	 */
	public void addRequisitionClose(RequisitionClose requisitionClose);

	/**
	 * Funcion que devuelve un listado de Pedidos Cerrados
	 * 
	 * @return {@link List}
	 */
	public List<Requisition> listRequisitionClose();

	/**
	 * Funcion que devuelve un pedido, recibe una ID
	 * 
	 * @param ID
	 * @return
	 */
	public Requisition getRequisition(int ID);

	/**
	 * Funcion que elimina un Detalle de pedido
	 * 
	 * @param ID
	 * @return
	 */
	public RequisitionDetail getRequisitionDetail(int ID);

	/**
	 * Funcion que devuelve un Listado De detalle de pedido, filtrado por
	 * Pedido, recibe ID de pedido
	 * 
	 * @param ID
	 * @return
	 */
	public List<RequisitionDetail> listRequisitionDetailByReq(int ID);

	/**
	 * Funcion que devuelve un listado de detalle de pedidos cerrados filtrado
	 * por pedido
	 * 
	 * @param ID
	 * @return
	 */
	public List<RequisitionClose> listRequisitionDetailCloseByReq(int ID);

	/**
	 * Funcion que devuelve un listado de pedidos filtrado por usuarios
	 * 
	 * @param ID
	 * @return
	 */
	public List<Requisition> listRequisitionByUser(int ID);

	/**
	 * Funcion que devuelve un Objeto estado
	 * 
	 * @param ID
	 * @return
	 */
	public RequisitionState getState(int ID);

	/**
	 * Funcion que permite setear el estado
	 * 
	 * @param ID
	 * @return
	 */

	public RequisitionState setState(int ID);

	/**
	 * Funcion que devuelve un listado de pedidos, filtrado por Usuario y por
	 * estado. Recibe la ID del usuario y el estado
	 * 
	 * @param ID
	 * @param state
	 * @return
	 */
	public List<Requisition> listRequisitionByUserByState(int ID, int state);

	public List<RequisitionClose> getListRequisitionClose();

	/**
	 * Funcion que devuelve un listado de pedidos abierto entre dos fechas
	 * 
	 * @param a
	 * @param b
	 * @return
	 */

	public List<Requisition> listofRequisitionbyDate(long sinceDate, long toDate);

	/**
	 * Funcion que devuelve un listado Object[] Clientes que tengan mas pedidos
	 * abiertos que cerrados
	 * 
	 * @return
	 */

	public List<Object[]> listRequisitionOpen();
}
